/* CoralCube | Massively Multiplayer Online Role-Playing Game(MMORPG) Emulator.
|* 
|* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|*               2005-2010 MaNGOS <http://getmangos.com/>
|*               2008-2010 CoralCube <http://www.CoralCube.com/>
|*
|* This program is free software. You can redistribute it and/or modify it under the terms of 
|* the GNU General Public License as published by the Free Software Foundation, either 
|* version 2 of the License.
|*
|* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY, 
|* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
|* See the GNU General Public License for more details.
|*
|* You should have received a copy of the GNU General Public License along with this program. 
|* If not, see <http://www.gnu.org/licenses/>.
|*/

#ifndef SC_SYSTEM_H
#define SC_SYSTEM_H

#define TEXT_SOURCE_RANGE -1000000                          //the amount of entries each text source has available

#define TEXT_SOURCE_TEXT_START      TEXT_SOURCE_RANGE
#define TEXT_SOURCE_TEXT_END        TEXT_SOURCE_RANGE*2 + 1

#define TEXT_SOURCE_CUSTOM_START    TEXT_SOURCE_RANGE*2
#define TEXT_SOURCE_CUSTOM_END      TEXT_SOURCE_RANGE*3 + 1

#define TEXT_SOURCE_GOSSIP_START    TEXT_SOURCE_RANGE*3
#define TEXT_SOURCE_GOSSIP_END      TEXT_SOURCE_RANGE*4 + 1

//TODO: find better namings and definitions.
//N=Neutral, A=Alliance, H=Horde.
//NEUTRAL or FRIEND = Hostility to player surroundings (not a good definition)
//ACTIVE or PASSIVE = Hostility to environment surroundings.
enum eEscortFaction
{
    FACTION_ESCORT_A_NEUTRAL_PASSIVE    = 10,
    FACTION_ESCORT_H_NEUTRAL_PASSIVE    = 33,
    FACTION_ESCORT_N_NEUTRAL_PASSIVE    = 113,

    FACTION_ESCORT_A_NEUTRAL_ACTIVE     = 231,
    FACTION_ESCORT_H_NEUTRAL_ACTIVE     = 232,
    FACTION_ESCORT_N_NEUTRAL_ACTIVE     = 250,

    FACTION_ESCORT_N_FRIEND_PASSIVE     = 290,
    FACTION_ESCORT_N_FRIEND_ACTIVE      = 495,

    FACTION_ESCORT_A_PASSIVE            = 774,
    FACTION_ESCORT_H_PASSIVE            = 775,

    FACTION_ESCORT_N_ACTIVE             = 1986,
    FACTION_ESCORT_H_ACTIVE             = 2046
};

struct ScriptPointMove
{
    uint32 uiCreatureEntry;
    uint32 uiPointId;
    float  fX;
    float  fY;
    float  fZ;
    uint32 uiWaitTime;
};

struct StringTextData
{
    uint32 uiSoundId;
    uint8  uiType;
    uint32 uiLanguage;
    uint32 uiEmote;
};

class SystemMgr
{
public:
    SystemMgr();
    ~SystemMgr() { }

    static SystemMgr& Instance();

    //Maps and lists
    typedef UNORDERED_MAP<int32, StringTextData> TextDataMap;
    typedef UNORDERED_MAP<uint32, std::vector<ScriptPointMove> > PointMoveMap;

    //Database
    void LoadVersion();
    void LoadScriptTexts();
    void LoadScriptTextsCustom();
    void LoadScriptGossipTexts();
    void LoadScriptWaypoints();

    //Retrive from storage
    StringTextData const* GetTextData(int32 uiTextId) const
    {
        TextDataMap::const_iterator itr = m_mTextDataMap.find(uiTextId);

        if (itr == m_mTextDataMap.end())
            return NULL;

        return &itr->second;
    }

    std::vector<ScriptPointMove> const &GetPointMoveList(uint32 uiCreatureEntry) const
    {
        static std::vector<ScriptPointMove> vEmpty;

        PointMoveMap::const_iterator itr = m_mPointMoveMap.find(uiCreatureEntry);

        if (itr == m_mPointMoveMap.end())
            return vEmpty;

        return itr->second;
    }

protected:
    TextDataMap     m_mTextDataMap;                     //additional data for text strings
    PointMoveMap    m_mPointMoveMap;                    //coordinates for waypoints
};

#define sScriptSystemMgr SystemMgr::Instance()

#endif
